/**
 * Markdown处理工具模块
 * 提供Markdown内容拆分和渲染功能
 */
import Vditor from 'vditor';

/**
 * 将Markdown内容拆分为多个部分
 * 使用'---'作为分隔符将内容拆分为多个卡片
 * @param content Markdown内容
 * @returns 拆分后的内容数组
 */
export const splitMarkdownContent = (content: string): string[] => {
  // 将内容按行分割
  const lines = content.split('\n');
  let currentPart = '';
  let parts: string[] = [];

  // 遍历每一行，只有当一行仅包含'---'时才视为分隔符
  for (let i = 0; i < lines.length; i++) {
    const line = lines[i].trim();
    if (line === '---') {
      // 当遇到独立的'---'行时，将当前部分添加到parts数组
      if (currentPart.trim()) {
        parts.push(currentPart.trim());
      }
      currentPart = ''; // 重置当前部分
    } else {
      // 否则将当前行添加到当前部分
      currentPart += line + '\n';
    }
  }

  // 添加最后一部分
  if (currentPart.trim()) {
    parts.push(currentPart.trim());
  }

  // 如果没有分隔符，则使用整个内容
  return parts.length > 0 ? parts : [content]; 
}

/**
 * 渲染Markdown内容为HTML
 * 使用Vditor的预览功能将Markdown转换为HTML
 * @param parts Markdown内容数组
 * @returns Promise<string[]> HTML内容数组
 */
export const renderMarkdownToHtml = async (parts: string[]): Promise<string[]> => {
  return Promise.all(parts.map(part => {
    return new Promise<string>((resolve, reject) => {
      try {
        // 使用Vditor的markdown渲染功能
        const tempDiv = document.createElement('div');
        Vditor.preview(tempDiv, part, {
          mode: 'light',
          hljs: {
            style: 'github'
          },
          after: () => {
            try {
              // 处理有序列表的序号
              const olElements = tempDiv.querySelectorAll('ol');
              olElements.forEach(ol => {
                let index = 1;
                const startAttr = ol.getAttribute('start');
                if (startAttr) {
                  index = parseInt(startAttr, 10);
                }
                const liElements = ol.querySelectorAll(':scope > li');
                liElements.forEach(li => {
                  li.setAttribute('data-index', index.toString());
                  index++;
                });
              });
              // 渲染完成后返回HTML内容
              resolve(tempDiv.innerHTML);
            } catch (error) {
              console.error('处理列表序号失败:', error);
              // 即使处理序号失败，仍然返回渲染的HTML
              resolve(tempDiv.innerHTML);
            }
          }
        });
      } catch (error) {
        console.error('Markdown渲染失败:', error);
        reject(error);
      }
    });
  }));
}